#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn = 1e5 + 5;

// 链式前向星
struct Edge{
	int to, nxt;
}edges[maxn<<1];

int head[maxn], cnt;

int n, k, c;
int dep[maxn]; // 
int up[maxn];
int down1[maxn], down2[maxn]; // 向下的 最大值和次大值
int child[maxn];
int dist[maxn]; // 记录距离 i 最大的 距离

void add(int from , int to){
	edges[++cnt].nxt = head[from];
	edges[cnt].to = to;
	head[from] = cnt;
	return ;
}


// 求出 down1 和 down2 
void dfs1(int u, int d, int p){
	dep[u] = d;
	for (int i=head[u];i;i=edges[i].nxt) {
		int to = edges[i].to;
		if (to == p) {
			continue;
		}
		
		// 这里面是需要用的 子树的, 所以先 dfs 再处理
		dfs1(to, d+1, u);
		if (down1[to]+1 > down1[u]) {
			// 更新前先记录次大值
			down2[u] = down1[u];
			down1[u] = down1[to] + 1;
			child[u] = to; // 记录是从哪个子树转移过来
		}  else if (down1[to] + 1 > down2[u]) { // 不比 最大大, 但是比 次大 大
			// 否则 可能 
			down2[u] = down1[to] +1 ;			
		}
	}
}

// 更新 up
void dfs2(int u, int d, int p){
	dist[u] = max(up[u], down1[u]);
	for (int i=head[u];i;i=edges[i].nxt) {
		int to = edges[i].to;
		if (to == p) {
			continue;
		}
		// 
		up[to] = max(up[to], up[u]+1);
		// up 还可以由 父亲节点的某个子树转移过来
		// 但是前提是 这个节点不能属于这个子树
		if (child[u] != to) {
			up[to] = max(up[to], down1[u]+1);
		} else {
			// 否则只能 从 次大值转移过来
			up[to] = max(up[to], down2[u]+1);
		}
		
		// 注意, 因为这里面需要用到 父亲节点的, 所以需要先处理再 dfs
		dfs2(to, d+1, u);
	}
}



void solve(){
	cin >> n>>k>>c;
	
	
	for (int i=1;i<n;i++) {
		int a, b;
		cin >> a >> b;
		add(a, b);
		add(b, a);
	}
	
	// 求出以 1 为根节点的所有路径长度
	dfs1(1, 0, 0);
	// 再一次  dfs 求出以其他节点作为节点时的总的路径长度
	dfs2(1, 0, 0);
	int ans = 0;
	for (int i=1;i<=n;i++) {
		ans = max(ans, dist[i]*k-dep[i]*c);
	}
	cout << ans << '\n';
	
	// 注意每次使用完都要重新初始化
	for (int i=1;i<n;i++) {
		head[i] = dep[i] = dist[i] = up[i] = down1[i] = down2[i]=child[i]=0;
	}
	memset(edges, 0, sizeof(edges));
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t;
	cin >> t;
	while(t--){
		solve();
	}
	return 0;
}

